Using data from EMBER on European wholesale electricity prices (hourly - daily and monthly also exist). The hourly prices are the day-ahead wholesale prices by country.
Total load per bidding zone per market time unit - in our case, total load, per country, per hour in MW.
The following is data from ENTSO-E on hourly electricity loads.
Components: Actual total load (including losses without stored energy) = net generation – exports + imports – absorbed energy
## `summarise()` has grouped output by 'date_utc', 'country_code'. You can
## override using the `.groups` argument.
Actual Generation per Production Type from ENTSOE This value represents the actual aggregated net generation output in MW per market time unit (hour) and per production type.
Natural Gas, Netherlands TTF Natural Gas Forward Day Ahead, US$ per Million Metric British Thermal Unit
## New names:
## • `POILAPSP` -> `POILAPSP...17`
## • `POILAPSP` -> `POILAPSP...45`
## • `` -> `...89`
## • `` -> `...90`
## • `` -> `...91`
## • `` -> `...92`
## • `` -> `...93`
## • `` -> `...94`
## • `` -> `...95`
Imports and export flows of electricity from ENTSOE Transparency Platform. Physical flows between bidding zones per market time unit. Physical flow is defined as the measured real flow of energy between neighbouring bidding zones on the cross borders.
Note 1: Net imports still has some missing data and I’m not quite sure where it comes from (see Austria, Denmark, Switzerland). Note 2: Also, the seeming upper and lower limits must have to do with capacity constraints on imports and exports (see Belgium, Norway, Sweden).
A forecast of wind and solar power generation (MW) per country per hour of the following day data from ENTSOE Transparency Platform.
Below, I incorporate all explanatory variables (except solar and wind forecasts) above into a model of the mean (not yet variance). The first model incorporates the variables simply as levels whereas the second incorporates them as shares of total “load.”
Questions: - day-ahead versus current prices in all variables - are we not interested in deviations from forecasts for price-setting?
# Check to make sure data is ordered
de_full %>% arrange(date_utc) %>% all.equal(de_full)
## [1] TRUE
# The below model incorporates ARCH(24) to be selected over, available regressors for wind forecasts, solar forecasts, and imports to and from France. In line with Rintamaki et al, we incorporate moving average terms for half-day, daily, and weekly prices volatility (levels?). Seasonal moving average terms are not yet incorporated here as they are in Rintamaki et al. Rather we might want to consider the seasonal moving average to have a periodicity of 24 hours (moving average over the same time of day)
de_mod_levs <- arx(de_full$price_eur_m_whe,
mxreg = as.matrix(select(de_full,
'log_load',
'log_gen_biomass_mw', 'log_gen_gas_mw',
'log_gen_geothermal_mw', #'gen_nuclear_mw',
'log_gen_other_renewable_mw',
'log_gen_solar_mw',
'PNGASEU',
contains('hour'),
contains('month'),
"net_imports_SE",
"net_imports_PL",
"net_imports_CZ",
"net_imports_BE",
"net_imports_CH",
"net_imports_NO",
"net_imports_NL",
"net_imports_LU",
"net_imports_FR",
"net_imports_DK",
"net_imports_AT"
#"total_net_imports"
)))# 'gen_wind_mw' 'gen_coal_mw', 'gen_hydro_mw',
de_mod_levs %>% plot
# Need to disable Ljung Box tests because GUM does not pass diagnostic tests
de_levs_sel <- getsm(de_mod_levs, ar.LjungB = NULL, arch.LjungB = NULL)
##
## GUM mean equation:
##
## reg.no. keep coef std.error t-stat
## mconst 1 0 -1.1662e+03 2.5507e+01 -45.7198
## log_load 2 0 4.6348e+01 1.0749e+00 43.1197
## log_gen_biomass_mw 3 0 7.1141e+01 2.7168e+00 26.1854
## log_gen_gas_mw 4 0 1.4581e+01 2.9734e-01 49.0367
## log_gen_geothermal_mw 5 0 -1.0599e+01 5.9365e-01 -17.8540
## log_gen_other_renewable_mw 6 0 -5.6735e+00 5.9850e-01 -9.4794
## log_gen_solar_mw 7 0 4.6700e-01 7.3037e-02 6.3940
## PNGASEU 8 0 5.5526e+00 1.2933e-02 429.3482
## hour_1 9 0 1.1411e+00 8.0827e-01 1.4117
## hour_2 10 0 2.3400e+00 8.1274e-01 2.8791
## hour_3 11 0 1.4615e+00 8.1585e-01 1.7913
## hour_4 12 0 1.3466e+00 8.1899e-01 1.6442
## hour_5 13 0 3.1208e+00 8.1962e-01 3.8076
## hour_6 14 0 8.5589e+00 8.2498e-01 10.3747
## hour_7 15 0 1.3660e+01 8.4512e-01 16.1630
## hour_8 16 0 8.9449e+00 9.0346e-01 9.9008
## hour_9 17 0 -7.6736e-02 9.9922e-01 -0.0768
## hour_10 18 0 -6.7853e+00 1.0582e+00 -6.4122
## hour_11 19 0 -9.7737e+00 1.0888e+00 -8.9765
## hour_12 20 0 -1.2400e+01 1.0984e+00 -11.2887
## hour_13 21 0 -1.3822e+01 1.0990e+00 -12.5764
## hour_14 22 0 -1.1524e+01 1.0910e+00 -10.5629
## hour_15 23 0 -7.0978e+00 1.0799e+00 -6.5725
## hour_16 24 0 -1.6550e+00 1.0614e+00 -1.5593
## hour_17 25 0 7.5773e+00 1.0280e+00 7.3706
## hour_18 26 0 1.1976e+01 9.7779e-01 12.2481
## hour_19 27 0 1.1495e+01 9.4637e-01 12.1463
## hour_20 28 0 5.8717e+00 9.1393e-01 6.4247
## hour_21 29 0 1.8824e+00 8.7562e-01 2.1498
## hour_22 30 0 2.1186e+00 8.3843e-01 2.5268
## hour_23 31 0 -1.1040e+00 8.1193e-01 -1.3597
## month_2 32 0 -1.5298e+00 5.6393e-01 -2.7128
## month_3 33 0 -3.7984e+00 5.6332e-01 -6.7429
## month_4 34 0 3.3007e+00 6.3082e-01 5.2323
## month_5 35 0 6.5550e+00 6.8024e-01 9.6364
## month_6 36 0 9.0390e+00 7.0277e-01 12.8621
## month_7 37 0 8.9457e+00 7.0229e-01 12.7379
## month_8 38 0 1.5083e+01 6.9426e-01 21.7254
## month_9 39 0 1.6649e+01 6.4494e-01 25.8155
## month_10 40 0 8.6800e+00 5.9076e-01 14.6929
## month_11 41 0 3.7273e+00 5.6972e-01 6.5423
## month_12 42 0 9.0482e+00 5.6683e-01 15.9629
## net_imports_SE 43 0 5.8903e-03 4.4665e-04 13.1877
## net_imports_PL 44 0 -2.9023e-03 3.1474e-04 -9.2213
## net_imports_CZ 45 0 7.9559e-03 1.8233e-04 43.6345
## net_imports_BE 46 0 1.7451e-02 3.3020e-04 52.8499
## net_imports_CH 47 0 3.0716e-03 1.3094e-04 23.4587
## net_imports_NO 48 0 3.7376e-02 3.2432e-04 115.2434
## net_imports_NL 49 0 9.5948e-04 1.0681e-04 8.9829
## net_imports_LU 50 0 -5.6405e-03 6.9234e-04 -8.1470
## net_imports_FR 51 0 -2.2041e-03 1.0231e-04 -21.5429
## net_imports_DK 52 0 -5.5652e-04 1.4302e-04 -3.8913
## net_imports_AT 53 0 1.8771e-04 2.1113e-04 0.8891
## p-value
## mconst < 2.2e-16 ***
## log_load < 2.2e-16 ***
## log_gen_biomass_mw < 2.2e-16 ***
## log_gen_gas_mw < 2.2e-16 ***
## log_gen_geothermal_mw < 2.2e-16 ***
## log_gen_other_renewable_mw < 2.2e-16 ***
## log_gen_solar_mw 1.625e-10 ***
## PNGASEU < 2.2e-16 ***
## hour_1 0.1580346
## hour_2 0.0039890 **
## hour_3 0.0732416 .
## hour_4 0.1001384
## hour_5 0.0001404 ***
## hour_6 < 2.2e-16 ***
## hour_7 < 2.2e-16 ***
## hour_8 < 2.2e-16 ***
## hour_9 0.9387858
## hour_10 1.442e-10 ***
## hour_11 < 2.2e-16 ***
## hour_12 < 2.2e-16 ***
## hour_13 < 2.2e-16 ***
## hour_14 < 2.2e-16 ***
## hour_15 4.979e-11 ***
## hour_16 0.1189335
## hour_17 1.715e-13 ***
## hour_18 < 2.2e-16 ***
## hour_19 < 2.2e-16 ***
## hour_20 1.329e-10 ***
## hour_21 0.0315731 *
## hour_22 0.0115123 *
## hour_23 0.1739297
## month_2 0.0066731 **
## month_3 1.563e-11 ***
## month_4 1.678e-07 ***
## month_5 < 2.2e-16 ***
## month_6 < 2.2e-16 ***
## month_7 < 2.2e-16 ***
## month_8 < 2.2e-16 ***
## month_9 < 2.2e-16 ***
## month_10 < 2.2e-16 ***
## month_11 6.095e-11 ***
## month_12 < 2.2e-16 ***
## net_imports_SE < 2.2e-16 ***
## net_imports_PL < 2.2e-16 ***
## net_imports_CZ < 2.2e-16 ***
## net_imports_BE < 2.2e-16 ***
## net_imports_CH < 2.2e-16 ***
## net_imports_NO < 2.2e-16 ***
## net_imports_NL < 2.2e-16 ***
## net_imports_LU 3.783e-16 ***
## net_imports_FR < 2.2e-16 ***
## net_imports_DK 9.981e-05 ***
## net_imports_AT 0.3739647
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Diagnostics:
##
## Chi-sq df p-value
## Ljung-Box AR(1) 73043 1 0
## Ljung-Box ARCH(1) 67003 1 0
## 7 path(s) to search
## Searching: 1 2 3 4 5 6 7
##
## Path 1: 9 17 53 12 11
## Path 2: 11 9 12 53 17
## Path 3: 12 9 53 11 17
## Path 4: 17 53 31 24
## Path 5: 24 31 53 17
## Path 6: 31 17 53 24
## Path 7: 53 17 31 24
##
## Terminal models:
##
## info(sc) logl n k
## spec 1: 9.843718 -398596.2 81040 48
## spec 2: 9.843865 -398596.5 81040 49
##
## Retained regressors (final model):
##
## mconst log_load log_gen_biomass_mw log_gen_gas_mw log_gen_geothermal_mw log_gen_other_renewable_mw log_gen_solar_mw PNGASEU hour_2 hour_5 hour_6 hour_7 hour_8 hour_10 hour_11 hour_12 hour_13 hour_14 hour_15 hour_16 hour_17 hour_18 hour_19 hour_20 hour_21 hour_22 hour_23 month_2 month_3 month_4 month_5 month_6 month_7 month_8 month_9 month_10 month_11 month_12 net_imports_SE net_imports_PL net_imports_CZ net_imports_BE net_imports_CH net_imports_NO net_imports_NL net_imports_LU net_imports_FR net_imports_DK
de_levs_sel %>% plot
de_mod_shares <- arx(de_full$price_eur_m_whe,
mxreg = as.matrix(select(de_full,
'share_gen_biomass_mw',
'share_gen_gas_mw',
'share_gen_geothermal_mw', #'gen_nuclear_mw',
'share_gen_other_renewable_mw',
'share_gen_solar_mw',
'PNGASEU',
contains('hour'),
contains('month'),
share_net_imports)))# 'gen_wind_mw' 'gen_coal_mw', 'gen_hydro_mw',
de_mod_shares %>% plot
# Need to disable
de_shares_sel <- getsm(de_mod_shares, ar.LjungB = NULL, arch.LjungB = NULL)
##
## GUM mean equation:
##
## reg.no. keep coef std.error t-stat
## mconst 1 0 -5.0108e+00 1.3520e+00 -3.7063
## share_gen_biomass_mw 2 0 -5.8392e+01 1.6940e+01 -3.4471
## share_gen_gas_mw 3 0 3.1045e+02 3.1722e+00 97.8632
## share_gen_geothermal_mw 4 0 -8.2985e+04 1.8540e+03 -44.7609
## share_gen_other_renewable_mw 5 0 3.8669e+03 2.5273e+02 15.3003
## share_gen_solar_mw 6 0 -4.6769e+01 1.6378e+00 -28.5567
## PNGASEU 7 0 6.2317e+00 1.2175e-02 511.8624
## hour_1 8 0 -4.9035e-01 8.9292e-01 -0.5491
## hour_2 9 0 -5.8359e-01 8.9445e-01 -0.6525
## hour_3 10 0 -1.9591e+00 8.9504e-01 -2.1888
## hour_4 11 0 -2.5447e+00 8.9626e-01 -2.8393
## hour_5 12 0 3.1240e-01 8.9721e-01 0.3482
## hour_6 13 0 1.0094e+01 9.0437e-01 11.1614
## hour_7 14 0 1.7931e+01 9.1415e-01 19.6146
## hour_8 15 0 1.7806e+01 9.2055e-01 19.3433
## hour_9 16 0 1.3200e+01 9.2688e-01 14.2411
## hour_10 17 0 1.0522e+01 9.4452e-01 11.1396
## hour_11 18 0 1.0339e+01 9.7492e-01 10.6052
## hour_12 19 0 8.8475e+00 1.0037e+00 8.8152
## hour_13 20 0 8.0161e+00 1.0224e+00 7.8401
## hour_14 21 0 8.5076e+00 1.0283e+00 8.2735
## hour_15 22 0 1.1450e+01 1.0200e+00 11.2249
## hour_16 23 0 1.4647e+01 1.0025e+00 14.6106
## hour_17 24 0 2.2365e+01 9.8303e-01 22.7514
## hour_18 25 0 2.5761e+01 9.6432e-01 26.7144
## hour_19 26 0 2.4500e+01 9.4505e-01 25.9247
## hour_20 27 0 1.5842e+01 9.2458e-01 17.1337
## hour_21 28 0 7.5555e+00 9.0988e-01 8.3038
## hour_22 29 0 4.6499e+00 9.0128e-01 5.1593
## hour_23 30 0 -5.4562e-01 8.9408e-01 -0.6103
## month_2 31 0 3.4133e+00 6.1879e-01 5.5160
## month_3 32 0 4.8084e+00 6.1572e-01 7.8093
## month_4 33 0 8.8945e+00 6.7068e-01 13.2619
## month_5 34 0 1.2304e+01 7.1430e-01 17.2257
## month_6 35 0 1.0380e+01 7.2531e-01 14.3113
## month_7 36 0 3.8372e+00 7.1732e-01 5.3494
## month_8 37 0 8.5960e+00 7.1155e-01 12.0807
## month_9 38 0 1.1752e+01 6.6559e-01 17.6570
## month_10 39 0 8.9963e+00 6.3274e-01 14.2179
## month_11 40 0 6.4386e+00 6.2559e-01 10.2921
## month_12 41 0 6.6363e+00 6.2204e-01 10.6686
## share_net_imports 42 0 1.1124e+02 1.8518e+00 60.0703
## p-value
## mconst 0.0002104 ***
## share_gen_biomass_mw 0.0005670 ***
## share_gen_gas_mw < 2.2e-16 ***
## share_gen_geothermal_mw < 2.2e-16 ***
## share_gen_other_renewable_mw < 2.2e-16 ***
## share_gen_solar_mw < 2.2e-16 ***
## PNGASEU < 2.2e-16 ***
## hour_1 0.5829055
## hour_2 0.5141075
## hour_3 0.0286109 *
## hour_4 0.0045225 **
## hour_5 0.7276998
## hour_6 < 2.2e-16 ***
## hour_7 < 2.2e-16 ***
## hour_8 < 2.2e-16 ***
## hour_9 < 2.2e-16 ***
## hour_10 < 2.2e-16 ***
## hour_11 < 2.2e-16 ***
## hour_12 < 2.2e-16 ***
## hour_13 4.557e-15 ***
## hour_14 < 2.2e-16 ***
## hour_15 < 2.2e-16 ***
## hour_16 < 2.2e-16 ***
## hour_17 < 2.2e-16 ***
## hour_18 < 2.2e-16 ***
## hour_19 < 2.2e-16 ***
## hour_20 < 2.2e-16 ***
## hour_21 < 2.2e-16 ***
## hour_22 2.485e-07 ***
## hour_23 0.5416971
## month_2 3.478e-08 ***
## month_3 5.818e-15 ***
## month_4 < 2.2e-16 ***
## month_5 < 2.2e-16 ***
## month_6 < 2.2e-16 ***
## month_7 8.850e-08 ***
## month_8 < 2.2e-16 ***
## month_9 < 2.2e-16 ***
## month_10 < 2.2e-16 ***
## month_11 < 2.2e-16 ***
## month_12 < 2.2e-16 ***
## share_net_imports < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Diagnostics:
##
## Chi-sq df p-value
## Ljung-Box AR(1) 74406 1 0
## Ljung-Box ARCH(1) 68887 1 0
## 4 path(s) to search
## Searching: 1 2 3 4
##
## Path 1: 8 30 9 12
## Path 2: 9 8 30 12
## Path 3: 12 8 30 9
## Path 4: 30 8 9 12
##
## Terminal models:
##
## info(sc) logl n k
## spec 1 (1-cut): 10.04581 -406841.4 81040 38
##
## Retained regressors (final model):
##
## mconst share_gen_biomass_mw share_gen_gas_mw share_gen_geothermal_mw share_gen_other_renewable_mw share_gen_solar_mw PNGASEU hour_3 hour_4 hour_6 hour_7 hour_8 hour_9 hour_10 hour_11 hour_12 hour_13 hour_14 hour_15 hour_16 hour_17 hour_18 hour_19 hour_20 hour_21 hour_22 month_2 month_3 month_4 month_5 month_6 month_7 month_8 month_9 month_10 month_11 month_12 share_net_imports
de_shares_sel %>% plot
# # Perform gets model selection over the log-variance model above
# # Turn of ARCH diagnostics as the GUM does not pass (could possible manipulate lag and p value choice here)
# de_vmod <- getsv(de_mod, t.pval = 0.001, ar.LjungB = NULL)
#
# de_vmod %>% plot
#
# data_de %>% filter(de_price < 0)
Here, see the time series for Germany and Denmark (to compare to the data avialable in Rintamaki et al. - color portion of the TS plots). UK spotlight to discuss potential interest to David.
Using data from EMBER on European wholesale electricity prices (hourly - daily and monthly also exist), I perform the same analysis as above. The hourly prices are the day-ahead wholesale prices by country.
The following is data from ENTSO-E on hourly electricity loads.